﻿/*
===========================================================================
Immemorsion LGPL Source code
Copyright trszdev - rahimyanov@gmail.com

This file is part of Immemorsion.

Immemorsion is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Immemorsion is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public License
along with Immemorsion.  If not, see <http://www.gnu.org/licenses/>.
===========================================================================
*/

namespace Immemorsion
{
    public struct MemoryAddress
    {
        public long Value { get; set; }

        public override bool Equals(object obj)
        {
            if (obj == null)
                return false;

            var address = (MemoryAddress)obj;
            return address.Value == Value;
        }

        public static implicit operator MemoryAddress(long address)
        {
            return new MemoryAddress(address);
        }

        public static implicit operator MemoryAddress(int address)
        {
            return new MemoryAddress(address);
        }

        public static implicit operator long(MemoryAddress address)
        {
            return address.Value;
        }

        public static MemoryAddress operator +(MemoryAddress address1, MemoryAddress address2)
        {
            return new MemoryAddress(address1.Value + address2.Value);
        }

        public static MemoryAddress operator -(MemoryAddress address1, MemoryAddress address2)
        {
            return new MemoryAddress(address1.Value - address2.Value);
        }

        public MemoryAddress(long value) : this()
        {
            Value = value;
        }
    }
}
